<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Permissao_Acesso extends CI_Controller {

	/* Layout utilizado pela pagina. */
	public $layout = 'default_admin';
	
	/* Titulo da Pagina. */
	public $title = CLIENTE;
	
	/* Menu do sistema*/
	public $menuTopo = '';
	
	/* Menu do sistema*/
	public $menuLateral = '';
	
	/* Caminho do pão do sistema */
	public $caminhoPao = '';
	
	/* css utilizado pela pagina. */
	public $css = array('admin/bootstrap', 'admin/animate', 'admin/style', 'plugins/waitMe/waitMe' );
	
	/* Js utilizado pela pagina. */
	public $js = array('plugins/jquery/jquery-2.1.4', 'admin/bootstrap', 'plugins/metisMenu/jquery.metisMenu', 'plugins/slimscroll/jquery.slimscroll.min', 'admin/principal', 'plugins/pace/pace.min', 'plugins/jquery-cookie/jquery.cookie', 'plugins/waitMe/waitMe');
	
	private $classe;
	
	public function __construct()
	{
		parent::__construct();
		//Verifica se o usuário está logado
		usuarioLogado($this->session->userdata('logged'));
		
		$this->load->model('Vinculo_Perfil_Menu_Model', 'vinculo');
		$this->load->model('Perfil_Model', 'perfil');
		$this->load->model('Funcionalidade_Model', 'funcionalidade');
		$this->load->model('Vpm_Funcionalidade_Model', 'vpm');
		
		$this->classe = trim(strtolower(get_class($this)));	
		
		//Valida permissões do usuário
		$this->permissao_lib->validaUsuarioPermissaoAcessarModulo($this->classe);
		
		//Montando menu dinâmico
		$this->load->library('Menu_Lib', 'menu_lib');
		$this->menuTopo = $this->menu_lib->menuTopo();
		$this->menuLateral = $this->menu_lib->menuLateral($this->classe);
		$this->caminhoPao = $this->menu_lib->caminhoPao($this->classe, null, null);
		
	}
	
	public function index()	{					
		try {
				array_push($this->js, 'plugins/select2/select2.min', 'plugins/iCheck/icheck', 'plugins/formValidation/formValidation', 'plugins/framework/bootstrap', 'admin/permissao_acesso/permissao_acesso');
				array_push($this->css, 'plugins/select2/select2', 'plugins/iCheck/custom', 'plugins/formValidation/formValidation');
				
				$tipoPerfil = decrypt(trim($this->session->userdata('tipoPerfil')));
				
				$perfis = $this->perfil->listarPerfisAtivos($tipoPerfil);
					
				$html = '<option></option>';
					
				foreach ($perfis as $row){
				
					$html .= '<option value="'.$row->idPerfil.'">'.$row->descricao.'</option>';
				}
					
				$html .= '</select>';
				
				$data = null;
				$data["comboPerfil"] = $html;
				
				$this->load->view('admin/permissao_acesso/permissao_acesso', $data);
			
		}catch (Exception $e){
			echo ($e->getMessage());
		}
		
	}
	
	public function pesquisar()	{
		try {
			
			$this->layout = "";
			
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
			
			$html = "";
	
			$idPerfil = trim($this->input->post('perfil'));
			
			$perfil = $this->perfil->obter($idPerfil);
			
			$menuPai = $this->vinculo->listarMenuPaiPorPerfil($idPerfil);
			
			if (!empty($menuPai)){
				
				$html .= '<div class="row">
							<div class="col-md-12">
								<div class="ibox float-e-margins">
									<div class="ibox-title">
										<h5>Perfil:  '.$perfil->descricao.'</h5>
									</div>
									<div class="ibox-content">
										<form id="formPermissao" class="form-horizontal" method="post" accept-charset="UTF-8">
											<input type="hidden" id="idPerfil" name="idPerfil" value="'.encrypt($perfil->idPerfil).'">';
							
									$html .= '<div class="dd" id="nestable">
						                          <ol class="dd-list">';
							
									$html .= $this->montaMenuPai($idPerfil, $menuPai);
							
									$html .= '		</ol>
						                      </div>';
										
					$html .= '				<div class="form-group text-center m-t-lg" >
												<div class="col-md-12">
													<button type="button" class="btn btn-default" id="buttonCancelar">
														<i class="fa fa-times"></i>&nbsp;&nbsp;Cancelar
													</button>
													<button type="submit" class="btn btn-primary" id="buttonSalvar">
														<i class="fa fa-save"></i>&nbsp;&nbsp;Salvar
													</button>
												</div>
											</div>
										  </form>
									 </div>
								 </div>
							 </div>
						 </div>';
				
				$retornoJson = true;
				
			}else{
				//Não encontrou resultados
				$retornoJson = false;
				$tipoMensagem = "alert-info";
				$mensagem = "Sua pesquisa não retornou resultado!";
			}
			
			$json = null;
			$json['sucesso'] = $retornoJson;
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
			$json['html'] = $html;
			
			echo json_encode($json);
				
		}catch (Exception $e){
			$this->db->trans_rollback();
			
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
	
	}
	
	public function salvar(){
		
		try {
				
			$this->layout = "";
			
			$this->util_lib->validaPermissaoRegistro("salvar", $this->classe);
				
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
			
			$array = $_POST;
			
			if (is_array($array)){
				$idPerfil = decrypt(trim($array['idPerfil']));
				unset($array['idPerfil']);
			}else{
				$idPerfil = decrypt($array);
				unset($array);
			}
			//Iniciando transação
			$this->db->trans_begin();
			
			$vinculoBanco = $this->vpm->listarVpmFuncionalidadePorIdPerfil($idPerfil);
			
			if (!empty($array)){
				//Percorre o array da tela
				foreach ($array as $key => $row){
					
					foreach ($row as $row2){
						$achou = false;
						//Percorrer os dados do banco primeiro
						foreach ($vinculoBanco as $chave => $valor){
							if ((int)$row2 === (int)$valor->idFuncionalidade){
								$achou = true;
								$retornoJson = true;
								unset($vinculoBanco[$chave]);
								break;
							}
						}
						
						if (!$achou){
							$idVinculoPerfilMenu = str_replace("check_", "", $key);
							
							foreach ($row as $row2){
								
								$existe = $this->vpm->listaFuncionalidadeVinculadaPerfil($row2, $idVinculoPerfilMenu);
								
								if (empty($existe)){
									$vpmFuncionalidade = null;
									$vpmFuncionalidade["idFuncionalidade"] = $row2;
									$vpmFuncionalidade["idVinculoPerfilMenu"] = $idVinculoPerfilMenu;
							
									$idVpmFuncionalidade = $this->vpm->inserir($vpmFuncionalidade);
							
									if (!empty($idVpmFuncionalidade) && $idVpmFuncionalidade != false){
										$retornoJson = true;
									}else{
										$retornoJson = false;
										break;
									}
								}
							}
						}
					}
				}
				
				//Se o array do banco não estiver vazio é pq foi removido da tela e deve ser excluído
				if ($retornoJson && !empty($vinculoBanco)){
					foreach ($vinculoBanco as $chave => $valor){
						if ($this->vpm->excluir($valor->idVpmFuncionalidade)){
							$retornoJson = true;
						}else{
							$retornoJson = false;
							break;
						}
					}
				}
			}else{
				//Exclui todos os vinculos do perfil
				$retornoJson = $this->vpm->excluirPorIdPerfil($idPerfil);
			}
			
			if ($retornoJson){
				$this->db->trans_commit();
				$tipoMensagem = "alert-success";
				$mensagem = "Permissões de acesso alterados com sucesso!";
			}else{
				throw new Exception('Ocorreu um erro ao alterar as permissões de acesso!');
			}
			
			$json = null;
			$json['sucesso'] = $retornoJson;
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
			
			echo json_encode($json);
	
		}catch (Exception $e){
			$this->db->trans_rollback();
			
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
	
	}
	
	private function montaMenuPai($idPerfil, $lista){
	
		try {
	
			$html = "";
			
			foreach ($lista as $row){
				
				$html .= '<li class="dd-item" data-id="'.$row->idVinculoPerfilMenu.'">';
				
				$checkbox = "";
				
				if (!empty($row->classe)){
					
					$checkbox .= '<div class="checkbox i-checks pull-right" style="margin-top: -2px;">';
					
					//Busca todas as funcionalidades possíveis do menu
					$funcMenu = $this->funcionalidade->listaFuncionalidadePorMenu($row->idMenu);
					
					foreach ($funcMenu as $row2){
							
						//Busca a permissão do perfil com a funcionalidade
						$vincFunc = $this->vpm->listaFuncionalidadeVinculadaPerfil($row2->idFuncionalidade, $row->idVinculoPerfilMenu);
							
						$checked = (!empty($vincFunc)) ? "checked='checked'" : "";
							
						$func = '';
							
						if ((int)$row2->tipoFuncionalidade === 1){
							$func = "Cadastrar";
						}else if ((int)$row2->tipoFuncionalidade === 2){
							$func = "Alterar";
						}else if ((int)$row2->tipoFuncionalidade === 3){
							$func = "Excluir";
						}else if ((int)$row2->tipoFuncionalidade === 4){
							$func = "Inativar";
						}else if ((int)$row2->tipoFuncionalidade === 5){
							$func = "Reativar";
						}
							
						$checkbox .= '<input type="checkbox" name="check_'.$row->idVinculoPerfilMenu.'[]" value="'.$row2->idFuncionalidade.'" '.$checked.' ><label class="label_permissao">'.ucfirst($func).'</label>';
					}
					
					$checkbox .= '</div>';
				}
				
				//Busca Menu Filhos
				$menuFilho = $this->vinculo->listarMenuFilhoPorIdMenuPai($idPerfil, $row->idMenu);
				
				//Se não tiver menus filhos
				if (empty($menuFilho)){
					
					$html .= '  <div class="dd-handle">
									'.$checkbox.'
									<span class="label label-info">
										<i class="'.trim($row->imgMenu).'"></i>
									</span> '.trim($row->descricao).'
								</div>';
						
				}else{
						
					$html .= '  <div class="dd-handle">
									'.$checkbox.'
									<span class="label label-info">
										<i class="'.trim($row->imgMenu).'"></i>
									</span> '.trim($row->descricao).'
								</div>';
						
					$html .= $this->montaMenuFilho($idPerfil, $menuFilho);
					
				}
				
				$html .= '</li>';
			}
				
			return $html;
	
		} catch (Exception $e) {
			throw $e;
		}
	
	}
	
	private function montaMenuFilho($idPerfil, $lista){
	
		try {
				
			$html = ' <ol class="dd-list">';
				
			foreach ($lista as $row){
				
				$checkbox = "";
					
				if (!empty($row->classe)){
					
					$checkbox .= '<div class="checkbox i-checks pull-right" style="margin-top: -2px;">';
					
					//Busca todas as funcionalidades possíveis do menu
					$funcMenu = $this->funcionalidade->listaFuncionalidadePorMenu($row->idMenu);
					
					foreach ($funcMenu as $row2){
							
						//Busca a permissão do perfil com a funcionalidade
						$vincFunc = $this->vpm->listaFuncionalidadeVinculadaPerfil($row2->idFuncionalidade, $row->idVinculoPerfilMenu);
						
						$checked = (!empty($vincFunc)) ? "checked='checked'" : "";
						
						$func = '';
					
						if ((int)$row2->tipoFuncionalidade === 1){
							$func = "Cadastrar";
						}else if ((int)$row2->tipoFuncionalidade === 2){
							$func = "Alterar";
						}else if ((int)$row2->tipoFuncionalidade === 3){
							$func = "Excluir";
						}else if ((int)$row2->tipoFuncionalidade === 4){
							$func = "Inativar";
						}else if ((int)$row2->tipoFuncionalidade === 5){
							$func = "Reativar";
						}
						
						$checkbox .= '<input type="checkbox" name="check_'.$row->idVinculoPerfilMenu.'[]" value="'.$row2->idFuncionalidade.'" '.$checked.' ><label class="label_permissao">'.ucfirst($func).'</label>';
					}
				
					$checkbox .= '</div>';
				}
					
				$menuFilho = $this->vinculo->listarMenuFilhoPorIdMenuPai($idPerfil, $row->idMenu);
					
				$html .= '  <li class="dd-item" data-id="'.$row->idVinculoPerfilMenu.'">';
				
				//Se não tiver filho
				if (empty($menuFilho)){
					
					$html .= '  <div class="dd-handle">
									'.$checkbox.'
									<span class="label label-info">
									<i class="'.trim($row->imgMenu).'"></i>
									</span> '.trim($row->descricao).'
								</div>';
						
				}else{
						
						
					$html .= '  <div class="dd-handle">
									'.$checkbox.'
									<span class="label label-info">
									<i class="'.trim($row->imgMenu).'"></i>
									</span> '.trim($row->descricao).'
								</div>';
						
					$html .= $this->montaMenuFilho($idPerfil, $menuFilho);
	
				}
				
				$html .= ' </li>';
					
			}
	
			$html .= '</ol>';
				
			return $html;
	
		} catch (Exception $e) {
			throw $e;
		}
	
	}
	
}